package com.chenjiaru.io;

import java.io.*;

/**
 * 2
 * 字符流操作
 *      1、适合操作文本文件也可以，不能操作二进制文件（会出问题）
 */
public class ReaderDemo {

    public static void main(String [] arr) {
        copyBufferedReader("C:\\software\\ideaCode\\chenjiaru\\java\\src\\main\\resources\\a.txt", "C:\\software\\ideaCode\\chenjiaru\\java\\src\\main\\resources\\b.txt");

    }



    /**
     * 节点流
     * 使用 FileReader FileWriter 实现文件拷贝
     * @param src       原路径
     * @param desc      目标路径
     */
    public static void copyByFileReader(String src, String desc) {
        FileReader fr = null;
        FileWriter fw = null;
        try {
            fr = new FileReader(src);
            fw = new FileWriter(desc);

            char[] buff = new char[1024];
            int len = -1;
            while ((len = fr.read(buff)) != -1) {
                System.out.println("准备写=" + len);
                fw.write(buff, 0, len);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            close(fr);
            close(fw);
        }
    }

    /**
     * 处理流 BufferedReader（FileReader） BufferedWriter（FileWriter）
     *      1.只要关处理流就可以了，他会自动关对应的节点流
     *      2.处理流和节点流的方法基本一致，也多了newLine()readLine()读取一行的函数，但是内部实现了缓冲，提高了性能
     * @param src       原路径
     * @param desc      目标路径
     */
    public static void copyBufferedReader(String src, String desc) {
        FileReader fr = null;
        BufferedReader br = null;
        FileWriter fw = null;
        BufferedWriter bw = null;
        try {
            fr = new FileReader(src);
            br = new BufferedReader(fr);

            fw = new FileWriter(desc);
            bw = new BufferedWriter(fw);

            char[] buff = new char[1024];
            int len = -1;
            while ((len = br.read(buff)) != -1) {
                System.out.println("准备写12=" + len);
                bw.write(buff, 0, len);
            }
            // 最后一次，需要刷新此缓冲的输出流，保证数据全部都能写出
            bw.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            close(br);
            close(bw);
        }
    }



    /**
     * 关闭输入流
     * @param fileReader
     */
    public static void close(Reader fileReader) {
        if (fileReader != null) {
            try {
                fileReader.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * 关闭流OutStream
     * @param fileWriter
     */
    public static void close(Writer fileWriter) {
        if (fileWriter != null) {
            try {
                fileWriter.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }



}
